'''
队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除.
进行插入的一端称为队尾(rear),插入动作称为进队或者入队
进行删除的一端称为队头(front),删除动作称为出队
队列的性质:先进先出(First-in,First-out)
'''

'''
队列的实现方式:
环形队列:当队尾指针rear == Maxsize -1 时,再前进一个位置就自动到0
    队首指针前进1:front = (front + 1) % Maxsize
    队尾指针前进1: rear = (rear + 1) % Maxsize
    队空条件: rear == front
    队满条件: (rear + 1) % Maxsize == front
'''
class Queue:
    def __init__(self,size=100):
        self.queue = [0 for _ in range(size)] #在不需要使用循环变量的场景，强烈建议用_作为占位符，
        # 这是专业Python开发者的通用实践。用i替代功能上可行，但会降低代码可读性，在团队协作中应避免使用。
        self.rear = 0   # 队尾指针
        self.front = 0   # 队首指针

    def push(self,element):
        if not self.is_empty():
            self.rear = (self.rear + 1) % self.size
            self.queue[self.rear] = element
        else:
            raise Exception

    def pop(self):
        if not self.is_filled():
            self.front = (self.front + 1) % self.size
            return self.queue[self.front]
        else:
            raise Exception

    def is_empty(self):
        return self.front == self.rear

    def is_filled(self):
        return (self.rare + 1) % self.size == self.front

'''
双向队列
    双向队列的两端都支持进队和出队操作
    双向队列的基本操作:
        队首进队
        队首出队
        队尾进队
        队尾出队
'''
'''
Python队列内置模块
    使用方法 from collections import deque
        创建队列  queue = dequeue()
        进队 append()
        出队 popleft()
        双向队列队首进队 appendleft()
        双向队列队尾出队 pop()
'''
from collections import deque
q = deque()

